#include "dma.h"

static uint16_t transfer_size; // 静态变量，存储 DMA 传输数据数目

void UserDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t size)
{
    DMA_InitTypeDef DMA_InitStructure;

    transfer_size = size; // 保存传输数据数目

    RCC_AHBPeriphClockCmd(DMA_CLK, ENABLE); // 使能 DMA 时钟

    DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;                       // 设置外设基地址
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据宽度为字节
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;         // 使能外设地址自增
    DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;                           // 设置存储器基地址
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         // 存储器数据宽度为字节
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                 // 使能存储器地址自增
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                      // 设置数据传输方向为外设到存储器
    DMA_InitStructure.DMA_BufferSize = size;                                // 设置传输数据数目
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                           // 设置为单次模式
    DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;                             // 使能存储器到存储器模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;                   // 设置优先级为中等
    DMA_Init(DMA_CHANNEL, &DMA_InitStructure);                              // 初始化 DMA 的通道
}

void UserDMA_Transfer(void)
{
    DMA_Cmd(DMA_CHANNEL, ENABLE);                         // 使能 DMA 的通道
    while (DMA_GetFlagStatus(DMA_FLAG_TC) == RESET);      // 等待传输完成标志位置位
    DMA_ClearFlag(DMA_FLAG_TC);                           // 清除传输完成标志位

    DMA_Cmd(DMA_CHANNEL, DISABLE);                        // 失能 DMA 的通道
    DMA_SetCurrDataCounter(DMA_CHANNEL, transfer_size);   // 设置当前数据传输数目
}
